Javascript 越來越紅,NodeJS 也越來越強大,說真的,在十幾年前怎麼也不會想到 Javascript 這個東西可以在後端執行。但是他就是真的發生了,也許會覺得很神奇,不過,既然有新的東西不斷地冒出來,那麼適時的去接觸也是挺合理的。
是說 JS 寫來寫去都沒有長進的說(抹臉
NodeJS
作者是這位天才 Ryan Dahl,把 Google 的 v8 引擎拿來寫出一套 framework,就叫做 nodejs。至於你說他能幹麼?以他目前快速發展的狀況來看,不知道以後能不能_上太空?_
語言特性是這樣,由於是從 Javascript 演進而來,所以是相當純粹的事件驅動(event driven)的方式在運作,沒有任何的阻塞(blocking)的問題,寫起來跟一般的 Javascript 沒什麼兩樣,就是不斷地 callback、callback、再 callback…
缺點是
如果不搭配一些模組的話,要實做一個 HTTP Server,幾乎是要從 HTTP 連線協定開始做起。個人覺得,難度是一回事,去理解這些事情又是另一回事。把他列為缺點其實也是嚴重了點,充其量只是說,要去做這些事情稍顯繁雜而已(被揍飛
第一次
既然說是第一次就上手,那麼上述那些複雜的東西就留給大家自己去研究。我們這邊來講一些輕鬆寫意又自然的東西,首先,你可能必須要知道的事情有,
NPM(Node Package Manager)是一個 NodeJS 的套件管理系統,原本與 NodeJS 是拆開來的,後來在 0.6.x 之後就放在一起了。這個東西相當的方便,你需要什麼套件,用他來安裝、移除、更新就可以了。
至於說 CoffeeScript 嘛,因為他是新的東西所以我放了上來(眾歐
首先是要安裝 nodejs,你可以去他的官網下載壓縮檔,下載下來就可以裝了,以下都是以 Ubuntu/node-0.6.14 為例子,
wget -c http://nodejs.org/dist/v0.6.14/node-v0.6.14.tar.gz
tar zxf node-v0.6.14.tar.gz
cd node-v0.6.14
./configure
make
sudo make install
如果不能安裝,你可能需要安裝下列套件,
git-core curl build-essential openssl libssl-dev
當然,身為 Ubuntu 的使用者,加個 PPA 用 apt 來裝也是很合理的,
sudo add-apt-repository ppa:chris-lea/node.js
sudo apt-get update
sudo apt-get install nodejs
裝好之後就可以看一下版本,
$ node -v
v0.6.14
$ npm -v
1.1.12
這樣就裝完了。另外,用 PPA 安裝的 NodeJS,我在檢查 NPM 版本的時候會怪怪的,不知道最近有沒有改掉?
Web Server
我們要用 NodeJS 來作一個簡易的 Web Server,但是我不想自己刻協定怎麼辦?沒關係,我們找一些模組來用,
其中 GeddyJS 是比較特殊的,他是一個蠻標準的 MCV 架構的套件,但是我之所以沒有用他的原因,是他的 View 使用的是 EJS,而我用的是另一套叫做 Jade。所以,把他列出來是想說,應該也有不少使用 EJS 的高手,所以放上來給大家參考一下。
至於 connect 則是因為,他有很多 Middleware 可以使用,如果你覺得你用不到,你不裝也是可以的。由於我在後面會講到一些東西,是要使用他的,所以這邊就先裝起來放了。
怎麼安裝?
$ npm install connect
$ npm install express
裝好之後就可以開使用了,什麼?太簡單?沒辦法啊,就這麼簡單。然後我們可以開始寫第一支 js 了,
var express = require("express"),
app = express.createServer(express.logger());
app.get("/", function(req, res) {
res.sendfile(__dirname + '/index.html', function(err) {
if (err) res.send(404);
});
});
port = process.env.PORT || 3000;
app.listen(port, function() {
console.log("Listening on " + port);
});
然後,我們再準備一支 index.html 來當作我們的輸出,
<h1>Hello NodeJS</h1>
接著就可以把 NodeJS 跑起來了,
$ node web.js
然後用你的瀏覽器打開 http://localhost:3000/ 就看得到結果了。然後或許你就想,哇,好方便,那我就一直寫 app.get 然後不斷地增加 html 檔案,就可以做完靜態網站了耶!
錯!
萬一我要用圖片怎麼辦?我的 Javascript 外部檔案怎麼辦?我的 CSS 檔案怎麼辦?沒關係,哥哥我都幫你想好了,
var express = require("express"),
app = express.createServer(express.logger());
app.get("/", function(req, res) {
res.sendfile(__dirname + '/index.html', function(err) {
if (err) res.send(404);
});
});
app.get(/(.*)\.(jpg|gif|png|ico|css|js|txt)/i, function(req, res) {
res.sendfile(__dirname + "/" + req.params[0] + "." + req.params[1], function(err) {
if (err) res.send(404);
});
});
port = process.env.PORT || 3000;
app.listen(port, function() {
console.log("Listening on " + port);
});
嗯,我們用一點小小地正規,只要把網址過濾一下,並且將合法的檔案直接送往前端,這樣就解決囉!至於你說會不會有 mime-type 的問題?嗯,這些事情他已經幫你解決掉了,除非你是使用相當特殊的文件,否則不會遇到檔案類別問題。
歐,我們的靜態網站做完了,可以收工了(喂